package com.heima.article.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.article.mapper.ApArticleConfigMapper;
import com.heima.article.mapper.ApArticleMapper;
import com.heima.article.service.IApArticleContentService;
import com.heima.article.service.IApArticleFreemarkerService;
import com.heima.article.service.IApArticleService;
import com.heima.model.article.dtos.ArticleDto;
import com.heima.model.article.dtos.SaveArticleDto;
import com.heima.model.article.pojos.ApArticle;
import com.heima.model.article.pojos.ApArticleConfig;
import com.heima.model.article.pojos.ApArticleContent;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class ApArticleServiceImpl extends ServiceImpl<ApArticleMapper, ApArticle> implements IApArticleService {
    @Autowired
    private ApArticleMapper apArticleMapper;
    @Autowired
    private ApArticleConfigMapper apArticleConfigMapper;
    @Autowired
    private IApArticleContentService apArticleContentService;
    @Autowired
    private IApArticleFreemarkerService apArticleFreemarkerService;

    /**
     * App端文章列表分页查询
     * @param dto
     * @param type
     * @return
     */
    @Override
    public ResponseResult load(ArticleDto dto, Integer type) {
        //校验参数
        //校验分页size
        if (dto.getSize() ==null || dto.getSize() == 0){
            dto.setSize(10);
        }
        //校验频道ID
        if (StringUtils.isBlank(dto.getTag())){
            dto.setTag("__all__");
        }
        //校验最大时间和最小时间
        if (dto.getMinBehotTime() == null){
            dto.setMinBehotTime(new Date());
        }
        if (dto.getMaxBehotTime() == null){
            dto.setMaxBehotTime(new Date());
        }
        //查询类型校验,type校验,如果没传值,给个默认值
        if (!type.equals(1) && !type.equals(2)){
            type = 2;
        }
        //调用方法去表中做查询
        List<ApArticle> apArticles = apArticleMapper.loadArticleList(dto, type);
        ResponseResult responseResult = ResponseResult.okResult(apArticles);
        return responseResult;
    }

    /**
     * 保存文章三剑客
     * @param dto
     * @return
     */
    @Override
    public ResponseResult saveArticle3(SaveArticleDto dto) {
        //校验请求参数是否存在
        if (dto == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        ApArticle apArticle = null;
        //请求参数存在,则判断请求参数中是否有id属性
        if (dto.getId() == null){
            //无id则是新增文章数据,封装数据调用方法新增三剑客即可
            //创建一个文章对象
            apArticle = new ApArticle();
            //将dto中的数据拷贝到对象中,存储到数据库中
            BeanUtils.copyProperties(dto,apArticle);
            //调用方法执行存储
            this.save(apArticle);
            //向文章配置表中新增数据,创建一个文章配置对象
            ApArticleConfig apArticleConfig = new ApArticleConfig(apArticle.getId());
            apArticleConfigMapper.insert(apArticleConfig);
            //向文章内容表中新增一条数据,创建一个文章内容对象
            ApArticleContent apArticleContent = new ApArticleContent();
            //给对象设置属性值
            apArticleContent.setArticleId(apArticle.getId());
            apArticleContent.setContent(dto.getContent());
            apArticleContentService.save(apArticleContent);
        }else {
            //有id则是修改文章数据
            //先从数据库中查询文章数据,判断文章数据是否存在,不存在则直接返回
            apArticle = this.getById(dto.getId());
            if (apArticle != null){
                //将请求参数中的数据拷贝到查询出来的对象中,并做修改操作
                BeanUtils.copyProperties(dto,apArticle);
                this.updateById(apArticle);
                //修改文章内容表数据,先从表中查询出数据,再进行修改操作,构造查询条件
                QueryWrapper<ApArticleContent> queryWrapper = new QueryWrapper<>();
                queryWrapper.eq("article_id",apArticle.getId());
                ApArticleContent apArticleContent = apArticleContentService.getOne(queryWrapper);
                //将文章内容进行重新设置再执行修改
                apArticleContent.setContent(dto.getContent());
                apArticleContentService.updateById(apArticleContent);
            }
            //没有查询出来文章数据,直接返回
            return ResponseResult.errorResult(501,"文章不存在,无法修改");
        }
        //将文本内容保存到minio中
        apArticleFreemarkerService.createArticleToMinio(apArticle,dto.getContent());
        //将文章id返回,
        return ResponseResult.okResult(apArticle.getId());
    }
}
